package docker

//docker网络 docker0
//清空所有容器和镜像在进行学习
// docker rm $(docker ps -aq)
// docker rmi -f $(docker images -aq)

/*

目录：
	1.查看服务器上的网卡/网络
	2.docker查看容器内部的网路地址,直接在后面追加append [ ip addr ]
			docker run -it -d -p myapp
			docker exec -it myapp ip addr

	3.原理
	4.veth-pair技术
	5.开启两个容器，是否可以通信；
		结论：容器和容器之间是可以相互ping通的，是可以通信的
			看图：桥接模式  images/041-桥接-docker-net多容器相互之间经过docker0进行通信.png
		所有容器在不指定 --net 网络的情况下，都是走的docker0，docker0会给容器分配一个默认的可用ip
		docker0相当于路由器，有广播和注册两种机制，把容器的ip注册到路由器中
		docker可以分配地址的数量，看6
	6.ip地址原理与规则


小结：
	docker使用的是linux的桥接,宿主机中是 一个docker容器的网桥docker0，启动容器后，如果不指定网络，就会由docker0分配一个地址，容器间的通信，走docker0
		看图 images/042-docker-net-多容器通讯.png
	docker中所有的网络接口都是虚拟的，因为虚拟的转发效率高
	docker的容器删除，被分配的虚拟网络evth一对也会被删除


----------查看服务器上的网卡/网络----------
	ip addr

root@VM-4-8-debian:~#  ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:15:5a:68 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 10.0.4.8/22 brd 10.0.7.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe15:5a68/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:c6:be:17:a7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c6ff:febe:17a7/64 scope link
       valid_lft forever preferred_lft forever
root@VM-4-8-debian:~#

	三个网卡/网络：代表了三种不同的环境
	1.lo: 本机回环地址				127.0.0.1/8
	2.eth0:腾讯云的内网地址			10.0.4.8/22
	3.docker0：docker生成的网卡	172.17.0.1/16
			docker0，路由器，docker的地址



----------查看服务器上的网卡/网络----------
	查看图片 images/docker-40-docker容器的ip-addr.png


	docker run -it -d --name tomcat01 tomcat
	docker exec -it tomcat01 ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
	....
58: eth0@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
	...


	注意：这里的 58 : eth0@if59

	linux可以ping通docker容器内部


----------原理----------

	1.我们每启动一个docker容器，docker就会给docker容器分配一个ip；而我们只要安装了docker，就会有一个默认网卡docker0
		docker0网卡是桥接模式，使用的技术是veth-pair技术


	运行两个容器
	docker run -it -d golang:1.19  /bin/bash
	docker run -it -d mysql			/bin/bash

	再在主机上使用 ip addr

root@VM-4-8-debian:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                 NAMES
56ff359a6b2d   mysql          "docker-entrypoint.s…"   15 minutes ago   Up 15 minutes   3306/tcp, 33060/tcp   stupefied_swartz
c81772b242cf   4f7c78c9b46f   "bash"                   20 minutes ago   Up 20 minutes                         frosty_banach
root@VM-4-8-debian:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:15:5a:68 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 10.0.4.8/22 brd 10.0.7.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe15:5a68/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:c6:be:17:a7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c6ff:febe:17a7/64 scope link
       valid_lft forever preferred_lft forever
59: veth5618db5@if58: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether ce:1d:17:d9:9b:15 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::cc1d:17ff:fed9:9b15/64 scope link
       valid_lft forever preferred_lft forever
63: veth212d965@if62: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 5e:4f:f8:b5:2f:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::5c4f:f8ff:feb5:2fa1/64 scope link
       valid_lft forever preferred_lft forever
root@VM-4-8-debian:~#


		注意：多了两个网卡

		59: veth5618db5@if58:
		63: veth212d965@if62:

			和上述启动容器后内部网卡内容一致，不过接口是相反的，[宿主机是eth059:58，容器内是 eth058:59]



----------veth-pair技术----------

	看图；  images/docker-net-043-veth-pair-桥接-bridge-网络模型-01.png
			image/docker-net-044-veth-pair-桥接-bridge-网络模型-02.png

	启动一个容器后，发现容器带来的网卡，都是一对一对的
	veth-pair 就是一对的虚拟设备接口，他们都是成对的出现，一段连着协议，一段彼此相连

	通过veth-pair 链接的，相互之间就可以开始通信

	正因为有这个特性，通常使用veth-pair充当一个桥梁，链接各种虚拟网络设备

		正常来说，liunx宿主机 ping不通 到docker里面的容器，正常来说是ping不通的
		但是使用了 veth-pair，在linux宿主机和docker容器两边都对接了一个接口
		两边的接口通过一种协议可以进行通信
		所以linux宿主机才能ping通道docker里面的容器




----------开启两个容器，是否可以通信----------
	启动tomcat01 tomcat02 两个容器

	docker run -it -d --name tomcat01 tomcat /bin/bash
	docker run -it -d --name tomcat02 tomcat /bin/bash

	tomcat01 是否可以ping通 tomcat02 ？

	docker exec -it tomcat01 ping 172.18.0.2  #172.18.0.2  是tomcat02的ip地址


	结论：容器和容器之间是可以相互ping通的，是可以通信的




----------ip地址的规则----------

	255.255.0.1/16     16

	0		.0		 .0		  .0        //0.0.0.0
	00000000.00000000.00000000.00000000
	  8位

	fmt.Printf("%b \n", 0)		0
	fmt.Printf("%b \n", 255)	11111111

	=>十进制
	0.0.0.0   =>   255.255.255.255

	/16  代表位数，16位
	255.255  2个8位=16位

	所以在 255.255.* 是一个网络    255.255.(0-255).(0.255) 后2位才是可分配地址
	所以能分配的地址

	0-255 是256个数字
	256*256 - 0.0.0.0(回环地址) - 255.255.255.255 的最终地址
	65534 / 65535


	当 255.255.0.1/24   可以当成一个局域网，小教室/24,公司/16
	3*8 = 24
	255.255.255.(0-255)  可分配地址，256-0.0.0-255.255.255.255 只有254个



*/
